#include <REGX52.H>

sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;


/**
  * @brief   I2C开始条件
  * @param   无
  * @retval  无
  */
void I2C_Start(void)
{
	I2C_SDA = 1; //初始状态置1
	I2C_SCL = 1; //初始状态置1
	
	
	I2C_SDA = 0; //SCL高电平时，SDA来个下降沿代表开始
	I2C_SCL = 0; //保证每个操作后面SCL都为0
	
}

/**
  * @brief   I2C停止条件
  * @param   无
  * @retval  无
  */

void I2C_Stop(void)
{
	I2C_SDA = 0; //停止前不确定SDA是否为0，所以要置0
	
	I2C_SCL = 1;
	I2C_SDA = 1; //SCL为高电平，SDA来个上升沿后表示停止
}

/**
  * @brief   发送一个字节
  * @param   要发送Byte
  * @retval  无
  */

void I2C_Send(unsigned char Byte)
{
	unsigned char i = 0;
	
	for(i = 0; i < 8; i++)
	{
		I2C_SDA = Byte & (0x80 >> i);
		
		I2C_SCL = 1;
		I2C_SCL = 0;
	}
	
}

/**
  * @brief   接受一个字节
  * @param   无
  * @retval  接受到的字节Byte
  */

unsigned char I2C_Receive(void)
{
	unsigned char i = 0;
	
	unsigned char Byte = 0x00;
	
	I2C_SDA = 1;//释放IO口，让从机控制
	
	for(i = 0; i < 8; i++)
	{	
		 
		I2C_SCL = 1;
		
		if(I2C_SDA) { Byte |=  (0x80 >> i); }//高电平期间读取SDA
		
		I2C_SCL = 0;
	}
	
	return Byte;
}

/**
  * @brief   主机发送应答
  * @param   Ack 应答位 0应答 1非应答或全部传输完毕
  * @retval  无
  */

void SendAck(unsigned char Ack)
{
	
	I2C_SDA = Ack;//主机发送应答给从机
	
	I2C_SCL = 1;
	I2C_SCL = 0;
	
}

/**
  * @brief   主机接受应答
  * @param   Ack 应答位 0应答 1非应答
  * @retval  无
  */

unsigned char ReceiveAck(void)
{
	unsigned char Ack = 2;
	
	I2C_SDA = 1;//释放SDA
	
	I2C_SCL = 1;
	
	Ack = I2C_SDA;
	
	I2C_SCL = 0;
	
	return Ack;
	
}


